package com.hxzy.config.interceptor;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import com.hxzy.common.enums.AckCode;
import com.hxzy.common.resp.R;
import com.hxzy.controller.login.resp.LoginResp;
import com.hxzy.controller.mapstruct.LoginConvert;
import com.hxzy.entity.UserinfoWy;
import com.hxzy.service.UserinfoWyService;
import com.hxzy.util.DemoThreadLocalUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;

/**
 * @Desc 描述
 * @Author: admin
 * @Date: 2023/08/21/9:34
 */
@Component
public class DemoInterceptor implements HandlerInterceptor {

    @Autowired
    private UserinfoWyService userinfoWyService;

    /**
     * 在执行controller方法之前事情（spring  aop 增强）
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //从请求头获取令牌的信息
        String token = request.getHeader("Authorization");
        if(StrUtil.isBlank(token)){
            outJson(response,AckCode.TOKEN_NOT_BLANK);
            return false;
        }

        //如果有令牌，验证令牌的有效性
        boolean isTrue=JWTUtil.verify(token,"jfsalkdjfwruw2r3095u3gdlkfmaguirnadgiae0iw0wtuq3093482".getBytes(StandardCharsets.UTF_8));
        if(!isTrue){
            outJson(response,AckCode.APPLE_FAIL);
            return false;
        }

        //解析令牌中的值
        JWT jwt = JWTUtil.parseToken(token);
        String uuid=jwt.getPayload("token").toString();

        //从数据库，查询令牌在不在，令牌过期没有
        UserinfoWy db=this.userinfoWyService.searchByToken(uuid);
        if(db==null){
            outJson(response,AckCode.APPLE_EXPIRED);
            return false;
        }

        //把数据库对象转换成自定义对象（数据库值很多，前端需要的值不是所有的内容）
//        LoginResp loginResp=new LoginResp();
//        loginResp.setId(db.getId());
//        loginResp.setName(db.getName());
//
//        //反射 对象copy
//        BeanUtils.copyProperties(db,loginResp);

        //使用mapstruct来实现
        LoginResp loginResp = LoginConvert.INSTANCE.convert(db);

        //把数据库值存起来，供后面的controller方法使用,使用本地线程池来实现
        DemoThreadLocalUtil.loginRespThreadLocal.set(loginResp);

        return true;
    }

    /**
     * 执行完controller以后做的事情(spring aop   后置增强)
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        DemoThreadLocalUtil.loginRespThreadLocal.remove();
    }

    /**
     * 输出信息到前端
     * @param response
     * @param ackCode
     */
    private void outJson(HttpServletResponse response, AckCode  ackCode) throws IOException {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json");

        PrintWriter  out= response.getWriter();

        R r=R.build(ackCode);
        //json序列化
        String jsonStr=JSONUtil.toJsonStr(r);

        out.println(jsonStr);
        out.flush();
        out.close();
    }

}
